package com.y.web.json;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import java.io.IOException;
import java.math.BigDecimal;

public class JsonScientificNotationConverter {

    private static final ObjectMapper mapper = new ObjectMapper();

    public static String convertScientificNotationToBigDecimal(String json) throws IOException {
        // 解析 JSON 字符串为 JsonNode 对象
        JsonNode rootNode = mapper.readTree(json);

        // 遍历 JsonNode 并转换科学计数法
        rootNode = convertScientificNotation(rootNode);

        // 将 JsonNode 对象转换回 JSON 字符串
        return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(rootNode);
    }

    private static JsonNode convertScientificNotation(JsonNode node) {
        // 检查当前节点是否为数值节点
        if (node.isNumber()) {
            // 如果是数值节点，并且包含 'e' 或 'E'，则认为是科学计数法
            if (node.asText().contains("e") || node.asText().contains("E")) {
                // 转换为 BigDecimal
                BigDecimal bigDecimal = new BigDecimal(node.asText());
                // 创建一个新的 ObjectNode 来替换当前的数值节点
                ObjectNode objectNode = mapper.createObjectNode();
                objectNode.put("BigDecimalValue", bigDecimal.toString());
                // 返回替换后的 ObjectNode
                return objectNode;
            }
        } else if (node.isObject()) {
            // 如果当前节点是对象节点，则递归处理子节点
            ObjectNode objectNode = (ObjectNode) node;
            objectNode.fields().forEachRemaining(entry -> {
                JsonNode childNode = objectNode.get(entry.getKey());
                objectNode.set(entry.getKey(), convertScientificNotation(childNode));
            });
            return objectNode;
        } else if (node.isArray()) {
            // 如果当前节点是数组节点，则递归处理数组元素
            JsonNode arrayNode = node;
            for (int i = 0; i < arrayNode.size(); i++) {
                JsonNode childNode = arrayNode.get(i);
                ((ArrayNode) arrayNode).set(i, convertScientificNotation(childNode));
            }
            return arrayNode;
        }
        // 对于其他类型的节点，直接返回原节点
        return node;
    }

    public static void main(String[] args) throws IOException {
        String jsonWithScientificNotation = "{\"value\": 1.234567890123456789e+9, \"array\": [1.23e-4, 5.67e+2]}";
        String jsonWithoutScientificNotation = convertScientificNotationToBigDecimal(jsonWithScientificNotation);
        System.out.println(jsonWithoutScientificNotation);
    }
}